package com.example.sqliteprueba;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class CargaDAO {
	private SQLiteDatabase database;
	private SQLAdmin dbHelper;

	private String[] allColumns = { SQLAdmin.COLUMN_ID, SQLAdmin.COLUMN_FECHA,
			SQLAdmin.COLUMN_KMS, SQLAdmin.COLUMN_PRECIO,
			SQLAdmin.COLUMN_LITROS, SQLAdmin.COLUMN_TANQUE_LLENO };

	public CargaDAO(Context context) {
		// dbHelper = new SQLAdmin(context);
		dbHelper = SQLAdmin.getInstance(context);
	}

	public void open() throws SQLException {
		database = dbHelper.getWritableDatabase();
	}

	public void close() {
		dbHelper.close();
	}

	public Carga createCarga(Carga carga) {
		open();
		ContentValues values = new ContentValues();

		// */
		Date fecha = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		// Get the date today using Calendar object.
		// try {
		// fecha = df.parse(carga.getFecha());
		// } catch (Exception ex) {
		// }

		// String fechaMilisecondStrings = String.valueOf(fecha.getTime());

		// */

		// values.put(SQLAdmin.COLUMN_FECHA, carga.getFecha());
		values.put(SQLAdmin.COLUMN_FECHA, df.format(carga.getFecha()));
		// values.put(SQLAdmin.COLUMN_FECHA, df.format(carga.getFecha()));
		values.put(SQLAdmin.COLUMN_KMS, carga.getKm());
		values.put(SQLAdmin.COLUMN_PRECIO, carga.getPrecio());
		values.put(SQLAdmin.COLUMN_LITROS, carga.getLitrosCargados());
		// insertOutcomes.put(DatabaseHelperInurseBusiness.ALLOW_GO,storedata.isAllowGo()==
		// true ? 1:0);
		if (carga.isTanqueLleno()) {
			values.put(SQLAdmin.COLUMN_TANQUE_LLENO, 1);
		} else {
			values.put(SQLAdmin.COLUMN_TANQUE_LLENO, 0);
		}
		if (carga.getId() != 0) {
			String where = SQLAdmin.COLUMN_ID + "=" + carga.getId();
			try {
				database.update(SQLAdmin.TABLE_CARGAS, values, where, null);
			} catch (Exception ex) {

			}

		} else {

			long insertId = database
					.insert(SQLAdmin.TABLE_CARGAS, null, values);
			Cursor cursor = database.query(SQLAdmin.TABLE_CARGAS, allColumns,
					SQLAdmin.COLUMN_ID + " = " + insertId, null, null, null,
					null);
			cursor.moveToFirst();
			carga = cursorToCarga(cursor);
			cursor.close();
		}
		close();
		return carga;

	}

	public void deleteCarga(Carga carga) {
		open();
		long id = carga.getId();
		System.out.println("Comment deleted with id: " + id);
		database.delete(SQLAdmin.TABLE_CARGAS, SQLAdmin.COLUMN_ID + " = " + id,
				null);
		close();
	}

	public List<Carga> getAllCargas() {
		open();
		List<Carga> cargas = new ArrayList<Carga>();

		Cursor cursor = database.query(SQLAdmin.TABLE_CARGAS, allColumns, null,
				null, null, null, SQLAdmin.COLUMN_FECHA + " ASC");

		cursor.moveToFirst();
		while (!cursor.isAfterLast()) {
			Carga carga = cursorToCarga(cursor);
			cargas.add(carga);
			cursor.moveToNext();
		}
		// make sure to close the cursor
		cursor.close();
		close();
		return cargas;
	}

	private Carga cursorToCarga(Cursor cursor) {
		Carga carga = new Carga();
		carga.setId(cursor.getLong(0));

		// */
		// Date fecha = new Date(Long.parseLong(cursor.getString(1)));
		String fecha = cursor.getString(1);
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		try {
			// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
			// Date fecha = df.parse(cursor.getString(1));
			// df = new SimpleDateFormat("dd-MM-yyyy");
			// carga.setFecha(df.format(fecha));

			// Get the date today using Calendar object.

			carga.setFecha(df.parse(fecha));
		} catch (Exception ex) {
			Log.e("ERROR", "ERROR EN FECHA");
		}

		// */
		// carga.setFecha(cursor.getString(1));
		carga.setKm(cursor.getFloat(2));
		carga.setPrecio(cursor.getFloat(3));
		carga.setLitrosCargados(cursor.getFloat(4));
		if (cursor.getInt(5) == 0) {
			carga.setTanqueLleno(false);
		} else {
			carga.setTanqueLleno(true);
		}
		carga.setLitrosCargados(cursor.getFloat(4));
		return carga;
	}

	public Carga getCarga(long id) {
		open();
		Cursor cursor = database.query(SQLAdmin.TABLE_CARGAS, allColumns,
				SQLAdmin.COLUMN_ID + " = " + id, null, null, null, null);
		cursor.moveToFirst();
		Carga newCarga = cursorToCarga(cursor);
		cursor.close();
		close();
		return newCarga;

	}

	/**
	 * Metodo que obtiene una lista de las cargas que se han registrado en el periodo que se encuentra entre 
	 * 		-> el dia 1 del mes siguiente a la variable 'time' pasada por parametro
	 * 		-> y una cantidad de meses antes indicada en la variable int 'meses' 
	 * @param time mes actual (va a ser el mes hasta)
	 * @param meses	cantidad de meses atras que se debe fijar para buscar las cargas
	 * @return lista de cargas comprendida en ese tiempo.
	 */
	public List<Carga> obtenerCargas(Date time, int meses) {
		List<Carga> cargas = new ArrayList<Carga>();
		// Creo las dos variables de fechas entre las que buscar (me deberian
		// dar del 1 del mes que esta en (time+1) como fechaHasta al 1 del mes
		// (time-meses) como fechaDesde.
		Date fechaDesde = new Date(time.getTime());
		Date fechaHasta = new Date(time.getTime());

		// Obtengo cuantos dias tiene el mes en cuestion en fechaDesde.
		Calendar c = Calendar.getInstance();
		c.setTime(fechaDesde);
		int diasDelMes = c.get(Calendar.DAY_OF_MONTH);

		// Le quito esos dias a la fechaDesde y luego le quito tantos
		// meses como la variable 'meses' lo indique
		c.add(Calendar.DATE, (-1) * (diasDelMes - 1));
		c.add(Calendar.MONTH, (-1) * meses);
		fechaDesde.setTime(c.getTimeInMillis());

		// A la variable fechaHasta le resto todos los dias dejandola en 1 y le
		// agregon un mes.
		c.setTime(fechaHasta);
		c.add(Calendar.DATE, (-1) * (diasDelMes - 1));
		c.add(Calendar.MONTH, 1);
		fechaHasta.setTime(c.getTimeInMillis());

		// COnsulta SQL
		open();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String selectQuery = "SELECT * FROM cargas WHERE fecha BETWEEN '"
				+ format.format(fechaDesde) + "' AND '"
				+ format.format(fechaHasta) + "' ORDER BY fecha ASC";
		Cursor cursor = database.rawQuery(selectQuery, null);
		cursor.moveToFirst();
		while (!cursor.isAfterLast()) {
			Carga carga = cursorToCarga(cursor);
			cargas.add(carga);
			cursor.moveToNext();
		}
		// make sure to close the cursor
		cursor.close();
		close();

		// Log.e("CantidadDeCargas", String.valueOf(cargas.size()));
		// Log.e("fechaDesde", format.format(fechaDesde));
		// Log.e("fechaHasta", format.format(fechaHasta));

		return cargas;

	}
}
